Respect grab event mask for crossing events
authorAlexander Larsson <alexl@redhat.com>
Tue, 15 Sep 2009 12:39:04 +0000 (14:39 +0200)
committerAlexander Larsson <alexl@redhat.com>
Tue, 15 Sep 2009 12:40:35 +0000 (14:40 +0200)
In the case of a non-owner_events grab, use grab->event_mask rather
than the window even mask to decide whether to deliver the event
or not.

gdk/gdkwindow.c

index 4194993d7cb0f8bff7cc786a43eaf147426e88b8..500bf6524d41da2c05d9bdfe07ec22c773ca3651 100644 (file)
@@ -9234,21 +9234,27 @@ send_crossing_event (GdkDisplay                 *display,
                     gulong                      serial)
 {
   GdkEvent *event;
-  guint32 event_mask;
+  guint32 window_event_mask, type_event_mask;
   GdkPointerGrabInfo *grab;
   GdkWindowImplIface *impl_iface;
 
   grab = _gdk_display_has_pointer_grab (display, serial);
 
   if (grab != NULL &&
-      !grab->owner_events &&
-      (GdkWindow *)window != grab->window)
-    return;
+      !grab->owner_events)
+    {
+      /* !owner_event => only report events wrt grab window, ignore rest */
+      if ((GdkWindow *)window != grab->window)
+       return;
+      window_event_mask = grab->event_mask;
+    }
+  else
+    window_event_mask = window->event_mask;
 
   if (type == GDK_LEAVE_NOTIFY)
-    event_mask = GDK_LEAVE_NOTIFY_MASK;
+    type_event_mask = GDK_LEAVE_NOTIFY_MASK;
   else
-    event_mask = GDK_ENTER_NOTIFY_MASK;
+    type_event_mask = GDK_ENTER_NOTIFY_MASK;
 
   if (window->extension_events != 0)
     {
@@ -9257,7 +9263,7 @@ send_crossing_event (GdkDisplay                 *display,
                                         type == GDK_ENTER_NOTIFY);
     }
 
-  if (window->event_mask & event_mask)
+  if (window_event_mask & type_event_mask)
     {
       event = _gdk_make_event ((GdkWindow *)window, type, event_in_queue, TRUE);
       event->crossing.time = time_;